/*
 * Copyright (C) 2024 ab_skywalker@163.com All Rights Reserved.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */
#include "display.h"
#include "drvSpi.h"
#include "SEGGER_RTT.h"
#include "stm32g0xx_hal.h"
void LCDInit(void)
{
    #ifdef LCD_480X480
    HAL_Delay(120);
    drvSpiWReg(0x11);
    HAL_Delay(120);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x10);

    drvSpiWReg(0xC0);
    drvSpiWByte(0x3B);
    drvSpiWByte(0x00);

    drvSpiWReg(0xC1);
    drvSpiWByte(0x0B); // VBP
    drvSpiWByte(0x02);

    drvSpiWReg(0xC2);
    drvSpiWByte(0x00);
    drvSpiWByte(0x02);

    drvSpiWReg(0xCC);
    drvSpiWByte(0x10);

    drvSpiWReg(0xCD);
    drvSpiWByte(0x08);

    drvSpiWReg(0xB0); // Positive Voltage Gamma Control
    drvSpiWByte(0x02);
    drvSpiWByte(0x13);
    drvSpiWByte(0x1B);
    drvSpiWByte(0x0D);
    drvSpiWByte(0x10);
    drvSpiWByte(0x05);
    drvSpiWByte(0x08);
    drvSpiWByte(0x07);
    drvSpiWByte(0x07);
    drvSpiWByte(0x24);
    drvSpiWByte(0x04);
    drvSpiWByte(0x11);
    drvSpiWByte(0x0E);
    drvSpiWByte(0x2C);
    drvSpiWByte(0x33);
    drvSpiWByte(0x1D);

    drvSpiWReg(0xB1); // Negative Voltage Gamma Control
    drvSpiWByte(0x05);
    drvSpiWByte(0x13);
    drvSpiWByte(0x1B);
    drvSpiWByte(0x0D);
    drvSpiWByte(0x11);
    drvSpiWByte(0x05);
    drvSpiWByte(0x08);
    drvSpiWByte(0x07);
    drvSpiWByte(0x07);
    drvSpiWByte(0x24);
    drvSpiWByte(0x04);
    drvSpiWByte(0x11);
    drvSpiWByte(0x0E);
    drvSpiWByte(0x2C);
    drvSpiWByte(0x33);
    drvSpiWByte(0x1D);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x11);

    drvSpiWReg(0xB0);
    drvSpiWByte(0x5d); // 5d

    drvSpiWReg(0xB1);  // VCOM amplitude setting
    drvSpiWByte(0x43); // 43

    drvSpiWReg(0xB2);  // VGH Voltage setting
    drvSpiWByte(0x81); // 12V

    drvSpiWReg(0xB3);
    drvSpiWByte(0x80);

    drvSpiWReg(0xB5);  // VGL Voltage setting
    drvSpiWByte(0x43); //-8.3V

    drvSpiWReg(0xB7);
    drvSpiWByte(0x85);

    drvSpiWReg(0xB8);
    drvSpiWByte(0x20);

    drvSpiWReg(0xC1);
    drvSpiWByte(0x78);

    drvSpiWReg(0xC2);
    drvSpiWByte(0x78);

    drvSpiWReg(0xD0);
    drvSpiWByte(0x88);

    drvSpiWReg(0xE0);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x02);

    drvSpiWReg(0xE1);
    drvSpiWByte(0x03);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x04);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x20);
    drvSpiWByte(0x20);

    drvSpiWReg(0xE2);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE3);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x11);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE4);
    drvSpiWByte(0x22);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE5);
    drvSpiWByte(0x05);
    drvSpiWByte(0xEC);
    drvSpiWByte(0xA0);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x07);
    drvSpiWByte(0xEE);
    drvSpiWByte(0xA0);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE6);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x11);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE7);
    drvSpiWByte(0x22);
    drvSpiWByte(0x00);

    drvSpiWReg(0xE8);
    drvSpiWByte(0x06);
    drvSpiWByte(0xED);
    drvSpiWByte(0xA0);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x08);
    drvSpiWByte(0xEF);
    drvSpiWByte(0xA0);
    drvSpiWByte(0xA0);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0xEB);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x40);
    drvSpiWByte(0x40);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0xED);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xBA);
    drvSpiWByte(0x0A);
    drvSpiWByte(0xBF);
    drvSpiWByte(0x45);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xFF);
    drvSpiWByte(0x54);
    drvSpiWByte(0xFB);
    drvSpiWByte(0xA0);
    drvSpiWByte(0xAB);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xFF);
    drvSpiWByte(0xFF);

    drvSpiWReg(0xEF);
    drvSpiWByte(0x10);
    drvSpiWByte(0x0D);
    drvSpiWByte(0x04);
    drvSpiWByte(0x08);
    drvSpiWByte(0x3F);
    drvSpiWByte(0x1F);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x13);

    drvSpiWReg(0xEF);
    drvSpiWByte(0x08);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0x36);
    drvSpiWByte(0x00);

    drvSpiWReg(0x3A);
    drvSpiWByte(0x60);
    
    drvSpiWReg(0x11);
    HAL_Delay(120);
    drvSpiWReg(0x29);
    #elif defined LCD_480X800
    HAL_Delay(120);
    drvSpiWReg(0x11);
    HAL_Delay(120);
    
    drvSpiWReg (0xff);
    drvSpiWByte (0x77);
    drvSpiWByte (0x01);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x10);

    drvSpiWReg (0xc0);
    drvSpiWByte (0x63);
    drvSpiWByte (0x00);

    drvSpiWReg (0xc1);
    drvSpiWByte (0x10);
    drvSpiWByte (0x0C);

    drvSpiWReg (0xc2);
    drvSpiWByte (0x00);
    drvSpiWByte (0x02);

    drvSpiWReg (0xc7);
    drvSpiWByte (0x04);

    drvSpiWReg (0xcc);
    drvSpiWByte (0x10);

    drvSpiWReg (0xB0);
    drvSpiWByte (0x06);
    drvSpiWByte (0x10);
    drvSpiWByte (0x16);
    drvSpiWByte (0x0D);
    drvSpiWByte (0x11);
    drvSpiWByte (0x06);
    drvSpiWByte (0x08);
    drvSpiWByte (0x07);
    drvSpiWByte (0x08);
    drvSpiWByte (0x22);
    drvSpiWByte (0x04);
    drvSpiWByte (0x14);
    drvSpiWByte (0x0F);
    drvSpiWByte (0x29);
    drvSpiWByte (0x2F);
    drvSpiWByte (0x1F);

    drvSpiWReg (0xB1);
    drvSpiWByte (0x0F);
    drvSpiWByte (0x18);
    drvSpiWByte (0x1E);
    drvSpiWByte (0x0C);
    drvSpiWByte (0x0F);
    drvSpiWByte (0x06);
    drvSpiWByte (0x08);
    drvSpiWByte (0x0A);
    drvSpiWByte (0x09);
    drvSpiWByte (0x24);
    drvSpiWByte (0x05);
    drvSpiWByte (0x10);
    drvSpiWByte (0x11);
    drvSpiWByte (0x2A);
    drvSpiWByte (0x34);
    drvSpiWByte (0x1F);

    drvSpiWReg (0xff);
    drvSpiWByte (0x77);
    drvSpiWByte (0x01);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x11);

    drvSpiWReg (0xb0);
    drvSpiWByte (0x4D);

    drvSpiWReg (0xb1);
    drvSpiWByte (0x3E);

    drvSpiWReg (0xb2);
    drvSpiWByte (0x81);

    drvSpiWReg (0xb3);
    drvSpiWByte (0x80);

    drvSpiWReg (0xb5);
    drvSpiWByte (0x4E);

    drvSpiWReg (0xb7);
    drvSpiWByte (0x85);

    drvSpiWReg (0xb8);
    drvSpiWByte (0x32);

    drvSpiWReg (0xBB);
    drvSpiWByte (0x03);

    drvSpiWReg (0xc1);
    drvSpiWByte (0x08);

    drvSpiWReg (0xc2);
    drvSpiWByte (0x08);

    drvSpiWReg (0xd0);
    drvSpiWByte (0x88);

    drvSpiWReg (0xe0);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x02); 

    drvSpiWReg (0xE1); 
    drvSpiWByte (0x06);
    drvSpiWByte (0x28);
    drvSpiWByte (0x08);
    drvSpiWByte (0x28);
    drvSpiWByte (0x05);
    drvSpiWByte (0x28);
    drvSpiWByte (0x07);
    drvSpiWByte (0x28);
    drvSpiWByte (0x0E);
    drvSpiWByte (0x33);
    drvSpiWByte (0x33);

    drvSpiWReg (0xE2); 
    drvSpiWByte (0x30);
    drvSpiWByte (0x30);
    drvSpiWByte (0x33);
    drvSpiWByte (0x33);
    drvSpiWByte (0x34);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x34);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);

    drvSpiWReg (0xe3);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x33);
    drvSpiWByte (0x33);

    drvSpiWReg (0xe4);
    drvSpiWByte (0x44);
    drvSpiWByte (0x44);

    drvSpiWReg (0xE5); 
    drvSpiWByte (0x0D);
    drvSpiWByte (0x33);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x0F);
    drvSpiWByte (0x35);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x09);
    drvSpiWByte (0x2F);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x0B);
    drvSpiWByte (0x31);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);

    drvSpiWReg (0xE6);  
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x33);
    drvSpiWByte (0x33);

    drvSpiWReg (0xE7); 
    drvSpiWByte (0x44);
    drvSpiWByte (0x44);

    drvSpiWReg (0xE8);
    drvSpiWByte (0x0C);
    drvSpiWByte (0x32);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x0E);
    drvSpiWByte (0x34);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x08);
    drvSpiWByte (0x2E);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);
    drvSpiWByte (0x0A);
    drvSpiWByte (0x30);
    drvSpiWByte (0x2C);
    drvSpiWByte (0x8C);

    drvSpiWReg (0xE9); 
    drvSpiWByte (0x36);
    drvSpiWByte (0x00);

    drvSpiWReg (0xEB);
    drvSpiWByte (0x00);
    drvSpiWByte (0x01);
    drvSpiWByte (0xE4);
    drvSpiWByte (0xE4);
    drvSpiWByte (0x44);
    drvSpiWByte (0x88);
    drvSpiWByte (0x40);

    drvSpiWReg (0xED);
    drvSpiWByte (0xFF);
    drvSpiWByte (0xCF);
    drvSpiWByte (0xA2);
    drvSpiWByte (0x45);
    drvSpiWByte (0x67);
    drvSpiWByte (0xFB);
    drvSpiWByte (0x01);
    drvSpiWByte (0xFF);
    drvSpiWByte (0xFF);
    drvSpiWByte (0x10);
    drvSpiWByte (0xBF);
    drvSpiWByte (0x76);
    drvSpiWByte (0x54);
    drvSpiWByte (0x2A);
    drvSpiWByte (0xFC);
    drvSpiWByte (0xFF);

    drvSpiWReg (0xef);
    drvSpiWByte (0x10);
    drvSpiWByte (0x0d);
    drvSpiWByte (0x04);
    drvSpiWByte (0x08);
    drvSpiWByte (0x3f);
    drvSpiWByte (0x1f);

    drvSpiWReg (0xff);
    drvSpiWByte (0x77);
    drvSpiWByte (0x01);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);
    drvSpiWByte (0x13);

    drvSpiWReg (0xe8);
    drvSpiWByte (0x00);
    drvSpiWByte (0x0e);

    drvSpiWReg (0x11);

    HAL_Delay(120);

    drvSpiWReg (0xe8);
    drvSpiWByte (0x00);
    drvSpiWByte (0x0c);

    HAL_Delay(10);

    drvSpiWReg (0xe8);
    drvSpiWByte (0x00);
    drvSpiWByte (0x00);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x13);

    drvSpiWReg(0xEF);
    drvSpiWByte(0x08);

    drvSpiWReg(0xFF);
    drvSpiWByte(0x77);
    drvSpiWByte(0x01);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);
    drvSpiWByte(0x00);

    drvSpiWReg(0x36);
    drvSpiWByte(0x10);

    drvSpiWReg(0x3A);
    drvSpiWByte(0x60);
    
    drvSpiWReg(0x11);
    HAL_Delay(120);
    drvSpiWReg(0x29);
    #endif
}
